( ** StarField Sprite Demo ** )

VARIABLE StringSpace
82 CHARS ALLOT          ( create a string buffer )
StringSpace 84 32 FILL  ( initialise it to ASCII 32 )
S" The Power Of Forth!" StringSpace SWAP CMOVE

0 VALUE FlipFlop

( vdp addresses for small, medium, & big star definitions)
$1000 CONSTANT Sml* 
$1008 CONSTANT Med* 
$1010 CONSTANT Big*

( keyboard codes )
CHAR E CONSTANT KeyE
CHAR S CONSTANT KeyS
CHAR D CONSTANT KeyD
CHAR X CONSTANT KeyX

( define colours )
15 CONSTANT White
9  CONSTANT TEN

( set up user defined graphics for the 3 star sizes )
: UDG Sml* DATA 4 $8000    0  0 0 2* VMBW ( small star )
      Med* DATA 4 $40E0 $4000 0 0 2* VMBW ( medium star )
      Big* DATA 4 $70F8 $F870 0 0 2* VMBW ( large star ) ;
      
( generate a random Y coordinate )
: RndY 180 RND ;

( generate a random X coordinate )
: RndX 256 RND ;

( set up our sprites. 10 small, 10 medium, 10 large )
: 10Small TEN FOR I       RndY RndX 0 White SPRITE NEXT ;
: 10Med   TEN FOR I 10 +  RndY RndX 1 White SPRITE NEXT ;
: 10Big   TEN FOR I 20 +  RndY RndX 2 White SPRITE NEXT ;

( set up the sprite movement list for each direction )
: GoLeft  TEN FOR I       0 -1 SPRVEC NEXT 
          TEN FOR I 10 +  0 -2 SPRVEC NEXT 
          TEN FOR I 20 +  0 -3 SPRVEC NEXT ;

: GoRight TEN FOR I       0  1 SPRVEC NEXT 
          TEN FOR I 10 +  0  2 SPRVEC NEXT 
          TEN FOR I 20 +  0  3 SPRVEC NEXT ;

: GoUp    TEN FOR I      -1  0 SPRVEC NEXT 
          TEN FOR I 10 + -2  0 SPRVEC NEXT
          TEN FOR I 20 + -3  0 SPRVEC NEXT ;

: GoDown  TEN FOR I       1  0 SPRVEC NEXT 
          TEN FOR I 10 +  2  0 SPRVEC NEXT 
          TEN FOR I 20 +  3  0 SPRVEC NEXT ;

: Delay 100 FOR NEXT ;

: DoFlipFlop FlipFlop NOT DUP TO FlipFlop ;

: ScanKeys 
   KEY? CASE 
      KeyE OF GoUp    ENDOF 
      KeyS OF GoLeft  ENDOF
      KeyD OF GoRight ENDOF
      KeyX OF GoDown  ENDOF
         2 OF 
           CR ." Break" CR QUIT
         ENDOF
   ENDCASE
;

: Scroll 
   DoFlipFlop IF 
    [ StringSpace 83 + LITERAL ] C@
    [ StringSpace LITERAL StringSpace 1+ LITERAL ] 83 CMOVE>
    [ StringSpace LITERAL ] C!
    0  0 GOTOXY [ StringSpace 32 + LITERAL ] 31 TYPE
    0 23 GOTOXY [ StringSpace 32 + LITERAL ] 31 TYPE
	ScanKeys
   THEN
;

: Setup 
   1 GMODE  0 SCREEN  UDG  10Small 10Med 10Big GoRight ;

: GO
   Setup BEGIN 0 30 SPRMOV Scroll Delay AGAIN ;
